Repository navigation
Framing returns to the pitch (2/2) - #284
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
rothlis
force-pushed
the
claude/framing-returns-to-pitch
branch
from
October 22, 2026 20:34
56969ad to
4df2ca5
Compare
Base automatically changed from
claude/rename-frame-to-request-b82d1f
to
main
October 23, 2026 14:49
A pitch now has a frame again (ADR 0032). It starts at the framing stage in an upcoming cycle, and it carries one or more sharp requests. - Pitch stages: framing → shaping → building → done. A stored framing stage stays framing. An unknown stage still reads as shaping. - A pitch holds request_ids, frame_outcomes, frame_appetite, release_summary and release_note_url. frame_outcome (free text) is gone. - A new pitch copies its frame from its requests: every outcome, the largest appetite, the problem summaries and the first release draft. Fields the caller writes win. An update copies nothing. - upsert_pitch refuses a rough or unknown request. The "Pitch" button on a request only offers upcoming cycles. - A request reads "pitched" while its pitch waits in an upcoming cycle. - The request page shows the release summary of the pitch that shipped. - The migration also turns frame_id or request_id into request_ids and frame_outcome into a list. Spec: #282 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- upsert_pitch checks request_ids on an update and in a batch too. A batched create is seeded like a single one. - A pitch at framing draws the dashed outline on the Product Map. - A pitch added to a build cycle that already started begins at shaping. - The Pitch panel says when no upcoming cycle exists. - pitchRequest no longer reads a Liveblocks failure as "no upcoming cycle". - isShapeStage reads STAGES instead of a second copy of the list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rothlis
force-pushed
the
claude/framing-returns-to-pitch
branch
from
October 23, 2026 14:49
4df2ca5 to
ca31386
Compare
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 2 of 2 for #282. This PR is stacked on #283. Merge #283 first.
What changes
A pitch has a frame again (ADR 0032). A new pitch starts at the
framingstage, in an upcoming cycle, and carries one or more sharp requests.framing → shaping → building → done. "Frame Go" is framing → shaping. "Shape Go" is shaping → building. A storedframingstage now staysframing. An unknown stage still reads asshaping.request_ids,frame_outcomes(a list),frame_appetite,release_summaryandrelease_note_url. The free-textframe_outcomeis gone.upsert_pitchrefuses a rough or unknown request and writes nothing, on a create and on an update, alone or in abatch.pitchedwhile its pitch waits in an upcoming cycle. A pitch that is in flight still wins over a pitched one.frame_idorrequest_idintorequest_ids, andframe_outcomeinto a one-item list. It is still safe to run twice.CAUTION: This code reads only
request_ids. If the migration of #283 already ran, run the migration again right after this PR deploys. Until then, every request loses its link to its pitches. The simplest release deploys #283 and #284 together and runs the migration once.Decisions I made that the spec left open
frame_prefix (frame_problem,frame_outcomes,frame_appetite). The frame is now part of the pitch, so the prefix is correct. It also avoids another rename offrame_problem.upsert_pitchdoes not check that the cycle is upcoming. An agent names the cycle. The app's "Pitch" button and its server action do check it.framingin an upcoming build cycle, and atshapingin a build cycle that already started.Tests
pitchedstate, upcoming cycles, the framing stage, the seed rule, the writer fields, the tool's sharp gate and seed, and the migration of pitch fields.e2e/scope-map.spec.tsnow looks for "Outcomes".🤖 Generated with Claude Code